#-----------------------------------------------------------------------
# File    : makefile    (directory: dtree)
# Contents: commands to build decision and regression tree programs
# Author  : Christian Borgelt
# History : ??.??.1995 file created
#           26.08.1997 makefile splitted into subdirectory makefiles
#           04.01.1998 table file scanner management added
#           08.02.1998 adapted to changed parse functions
#           18.05.1998 rule module added
#           26.05.1998 rule extraction program 'dtr' added
#           17.04.1999 input/output utility functions added
#           12.09.2000 variance table module added
#           12.12.2000 frqtab.o added to objects DTP_O
#           22.01.2002 adapted to changed table makefile
#           04.07.2002 module gamma added
#           06.07.2002 rule set execution added (program rsx)
#-----------------------------------------------------------------------
CC        = gcc
CFBASE    = -ansi -Wall -pedantic $(ADDFLAGS)
CFLAGS    = $(CFBASE) -DNDEBUG -O3
# CFLAGS    = $(CFBASE) -g
# CFLAGS    = $(CFBASE) -g $(ADDINC) -DSTORAGE
INC       = -I$(UTILDIR) -I$(TABLEDIR) -I$(MATHDIR)
LIBS      = -lm
# LIBS      = -lm -lefence
# ADDINC    = -I../../misc/src
# ADDOBJ    = storage.o

UTILDIR   = ../../util/src
MATHDIR   = ../../math/src
TABLEDIR  = ../../table/src
HDRS      = $(UTILDIR)/tfscan.h   $(UTILDIR)/vecops.h \
            $(UTILDIR)/scan.h     $(TABLEDIR)/attset.h \
            $(TABLEDIR)/table.h   $(TABLEDIR)/io.h dtree.h
OBJS      = $(UTILDIR)/tfscan.o   $(UTILDIR)/vecops.o \
            $(UTILDIR)/scan.o     $(TABLEDIR)/attset1.o \
            $(TABLEDIR)/attset2.o $(TABLEDIR)/attset3.o $(ADDOBJ)
DTI_O     = $(OBJS) $(TABLEDIR)/table1.o $(TABLEDIR)/io_tab.o \
            $(MATHDIR)/gamma.o ft_eval.o vt_eval.o \
            dtree.o dt_grow.o dti.o
DTP_O     = $(OBJS) $(TABLEDIR)/table1.o $(TABLEDIR)/io_tab.o \
            frqtab.o vartab.o dt_exec.o dt_prune.o dtp.o
DTX_O     = $(OBJS) $(TABLEDIR)/io.o dt_exec.o dtx.o
DTR_O     = $(OBJS) rules.o dt_rule.o dtr.o
RSX_O     = $(OBJS) $(TABLEDIR)/io.o rs_parse.o rsx.o
PRGS      = dti dtp dtx dtr rsx

#-----------------------------------------------------------------------
# Build Programs
#-----------------------------------------------------------------------
all:        $(PRGS)

dti:        $(DTI_O) makefile
	$(CC) $(LDFLAGS) $(DTI_O) $(LIBS) -o $@

dtp:        $(DTP_O) makefile
	$(CC) $(LDFLAGS) $(DTP_O) $(LIBS) -o $@

dtx:        $(DTX_O) makefile
	$(CC) $(LDFLAGS) $(DTX_O) $(LIBS) -o $@

dtr:        $(DTR_O) makefile
	$(CC) $(LDFLAGS) $(DTR_O) $(LIBS) -o $@

rsx:        $(RSX_O) makefile
	$(CC) $(LDFLAGS) $(RSX_O) $(LIBS) -o $@

#-----------------------------------------------------------------------
# Main Programs
#-----------------------------------------------------------------------
dti.o:      $(HDRS)
dti.o:      dti.c makefile
	$(CC) $(CFLAGS) $(INC) -c dti.c -o $@

dtp.o:      $(HDRS)
dtp.o:      dtp.c makefile
	$(CC) $(CFLAGS) $(INC) -c dtp.c -o $@

dtx.o:      $(HDRS)
dtx.o:      dtx.c makefile
	$(CC) $(CFLAGS) $(INC) -c dtx.c -o $@

dtr.o:      $(HDRS) rules.h
dtr.o:      dtr.c makefile
	$(CC) $(CFLAGS) $(INC) -c dtr.c -o $@

rsx.o:      $(HDRS) rules.h
rsx.o:      rsx.c makefile
	$(CC) $(CFLAGS) $(INC) -c rsx.c -o $@

#-----------------------------------------------------------------------
# Frequency Table Management
#-----------------------------------------------------------------------
frqtab.o:   frqtab.h
frqtab.o:   frqtab.c makefile
	$(CC) $(CFLAGS) $(INC) -c frqtab.c -o $@

ft_eval.o:  frqtab.h
ft_eval.o:  frqtab.c makefile
	$(CC) $(CFLAGS) $(INC) -DFT_EVAL -c frqtab.c -o $@

#-----------------------------------------------------------------------
# Variation Table Management
#-----------------------------------------------------------------------
vartab.o:   vartab.h
vartab.o:   vartab.c makefile
	$(CC) $(CFLAGS) -c vartab.c -o $@

vt_eval.o:  vartab.h
vt_eval.o:  vartab.c makefile
	$(CC) $(CFLAGS) -DVT_EVAL -c vartab.c -o $@

#-----------------------------------------------------------------------
# Decision and Regression Tree Management
#-----------------------------------------------------------------------
dtree.o:    $(HDRS)
dtree.o:    dtree1.c makefile
	$(CC) $(CFLAGS) $(INC) -c dtree1.c -o $@

dt_grow.o:  $(HDRS)
dt_grow.o:  dtree2.c makefile
	$(CC) $(CFLAGS) $(INC) -DDT_GROW -c dtree2.c -o $@

dt_prune.o: $(HDRS)
dt_prune.o: dtree2.c makefile
	$(CC) $(CFLAGS) $(INC) -DDT_PRUNE -c dtree2.c -o $@

dt_exec.o:  $(HDRS)
dt_exec.o:  dtree1.c makefile
	$(CC) $(CFLAGS) $(INC) -DDT_PARSE -c dtree1.c -o $@

dt_rule.o:  $(HDRS)
dt_rule.o:  dtree1.c makefile
	$(CC) $(CFLAGS) $(INC) -DDT_PARSE -DDT_RULES -c dtree1.c -o $@

#-----------------------------------------------------------------------
# Rule and Rule Set Management
#-----------------------------------------------------------------------
rules.o:    rules.h
rules.o:    rules.c makefile
	$(CC) $(CFLAGS) $(INC) -DRS_DESC -c rules.c -o $@

rs_parse.o: rules.h
rs_parse.o: rules.c makefile
	$(CC) $(CFLAGS) $(INC) -DRS_DESC -DRS_PARSE -c rules.c -o $@

#-----------------------------------------------------------------------
# External Modules
#-----------------------------------------------------------------------
$(UTILDIR)/vecops.o:
	cd $(UTILDIR);  $(MAKE) vecops.o  ADDFLAGS=$(ADDFLAGS)
$(UTILDIR)/tfscan.o:
	cd $(UTILDIR);  $(MAKE) tfscan.o  ADDFLAGS=$(ADDFLAGS)
$(UTILDIR)/scan.o:
	cd $(UTILDIR);  $(MAKE) scan.o    ADDFLAGS=$(ADDFLAGS)
$(MATHDIR)/gamma.o:
	cd $(MATHDIR);  $(MAKE) gamma.o   ADDFLAGS=$(ADDFLAGS)
$(TABLEDIR)/attset1.o:
	cd $(TABLEDIR); $(MAKE) attset1.o ADDFLAGS=$(ADDFLAGS)
$(TABLEDIR)/attset2.o:
	cd $(TABLEDIR); $(MAKE) attset2.o ADDFLAGS=$(ADDFLAGS)
$(TABLEDIR)/attset3.o:
	cd $(TABLEDIR); $(MAKE) attset3.o ADDFLAGS=$(ADDFLAGS)
$(TABLEDIR)/table1.o:
	cd $(TABLEDIR); $(MAKE) table1.o  ADDFLAGS=$(ADDFLAGS)
$(TABLEDIR)/io.o:
	cd $(TABLEDIR); $(MAKE) io.o      ADDFLAGS=$(ADDFLAGS)
$(TABLEDIR)/io_tab.o:
	cd $(TABLEDIR); $(MAKE) io_tab.o  ADDFLAGS=$(ADDFLAGS)

#-----------------------------------------------------------------------
# Storage Debugging
#-----------------------------------------------------------------------
storage.o:  ../../misc/src/storage.h
storage.o:  ../../misc/src/storage.c
	$(CC) $(CFLAGS) -c ../../misc/src/storage.c -o $@

#-----------------------------------------------------------------------
# Install
#-----------------------------------------------------------------------
install:
	cp $(PRGS) $(HOME)/bin

#-----------------------------------------------------------------------
# Clean up
#-----------------------------------------------------------------------
clean:
	rm -f *.o *~ *.flc core $(PRGS)
	cd $(UTILDIR);  $(MAKE) clean
	cd $(MATHDIR);  $(MAKE) clean
	cd $(TABLEDIR); $(MAKE) localclean

localclean:
	rm -f *.o *~ *.flc core $(PRGS)
